package org.javahispano.javacup.tacticas_aceptadas.TanoRojas.tano;


import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;

public class Utils {
    SituacionPartido sp;
    Posicion[] alineacion;
    
    
    //-----------------------------------------------------------------------------------------------------------------	
	public double distanciaRivalAPase(Posicion principio, Posicion fin, double minDist) {
		Posicion[] rivales = sp.rivales();
		double min = Double.MAX_VALUE;
		for(Posicion p : rivales)  {
		    double dist = distanciaPuntoALinea(principio, fin, p, true);
		    
		    if (minDist<dist && dist<min) min = dist;
		}		
		
	    return min;
	}	
	
	
	
	//-----------------------------------------------------------------------------------------------------------------
	public boolean puedoRematar(int numeroJugador) {
		int[] rematan = sp.puedenRematar();
		
		boolean puedeRematar = false;
		for (int i : rematan)
			if ((i+1) == numeroJugador)
				puedeRematar = true;
		
		return puedeRematar;
	}
			
    
  
	//-----------------------------------------------------------------------------------------------------------------	
	public boolean estoyMarcado(int numeroJugador) {
		Posicion rival = sp.rivales()[sp.misJugadores()[numeroJugador-1].indiceMasCercano(sp.rivales())];
		
		double distancia = rival.distancia(sp.misJugadores()[numeroJugador-1]);
		if (distancia<3) return true;
		else return true;
	}
	    
	
	
	//-----------------------------------------------------------------------------------------------------------------
	public void setSituacionPartido(SituacionPartido paramSp) {
		sp = paramSp;
	}

	
	
	//-----------------------------------------------------------------------------------------------------------------
	public void setAlineacion(Posicion[] paramAlin) {
		alineacion = paramAlin;
	}
	
	
	//-----------------------------------------------------------------------------------------------------------------
    private double productoPunto(Posicion A, Posicion B, Posicion C){
        double[] AB = new double[2];
        double[] BC = new double[2];
        AB[0] = B.getX()-A.getX();
        AB[1] = B.getY()-A.getY();
        BC[0] = C.getX()-B.getX();
        BC[1] = C.getY()-B.getY();
        
        double dot = AB[0] * BC[0] + AB[1] * BC[1];
        return dot;
    }
    
    
    //-----------------------------------------------------------------------------------------------------------------
    private double productoCruz(Posicion A, Posicion B, Posicion C){
    	double[] AB = new double[2];
    	double[] AC = new double[2];
        AB[0] = B.getX()-A.getX();
        AB[1] = B.getY()-A.getY();
        AC[0] = C.getX()-A.getX();
        AC[1] = C.getY()-A.getY();
        
        double cross = AB[0] * AC[1] - AB[1] * AC[0];
        return cross;
    }
    
    
    
    //-----------------------------------------------------------------------------------------------------------------
    public double distanciaPuntoALinea(Posicion A, Posicion B, Posicion C, boolean isSegment){
        double dist = productoCruz(A,B,C) / A.distancia(B);
        if(isSegment){
            double dot1 = productoPunto(A,B,C);
            if(dot1 > 0) return B.distancia(C);
            double dot2 = productoPunto(B,A,C);
            if(dot2 > 0) return A.distancia(C);
        }
        
        return Math.abs(dist);
    }
	
    
    
  //-----------------------------------------------------------------------------------------------------------------
    public boolean estaDentro(double x, double y) {
    	return (Constantes.centroArcoInf.getY()<y && y<Constantes.centroArcoSup.getY() && Constantes.cornerSupIzq.getX()<x && x<Constantes.cornerSupDer.getX());
    }
	
    
    
    //-----------------------------------------------------------------------------------------------------------------
    public boolean estaraDentro(double x, double y, double ang) {
    	double dx = 0.8*Math.cos(ang), dy = 0.8*Math.sin(ang);

    	for (int i=0; i<=Constantes.ITERACIONES_GOLPEAR_BALON; i++) {
    		dx = dx * Constantes.FACTOR_DISMINUCION_VEL_BALON_SUELO;
    		dy = dy * Constantes.FACTOR_DISMINUCION_VEL_BALON_SUELO;
    		
    		x += dx;
    		y += dy;
    	}            	
   	
    	return estaDentro(x, y);
    }    
    
    
    
}